package com.grz.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAspect {

    @Pointcut("@annotation(com.grz.aop.MyLog)")
    public void pointCut() {

    }

//    @After("pointCut()")
//    public void after(JoinPoint joinPoint) {
//        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
////        MyLog myLog = methodSignature.getMethod().getAnnotation(MyLog.class);
//        // 获取接口上的方法，但是接口上的方法没有注解，需要获取实现类的方法
//        // 怎么获取实现类的方法？
//        // 需要获取实现类的Class? 能获取实现类的Class吗？
//        // 获取了实现类的Class
//        Class clazz = joinPoint.getTarget().getClass();
//        // 获取实现类上的这个方法？ 需要两个条件，1 方法名 2. 参数类型列表
//        // 1. 方法名
//        String methodName = methodSignature.getName();
//        // 2. 方法参数的类型数组
//        Class[] argTypes = methodSignature.getParameterTypes();
//        try {
//            Method method = clazz.getMethod(methodName, argTypes);
//            MyLog myLog = method.getAnnotation(MyLog.class);
//            System.out.println("================记录日志=================");
//            System.out.println("操作："+myLog.method());
//            System.out.println("描述："+myLog.desc());
//            System.out.println("类型："+myLog.logType());
//        } catch (NoSuchMethodException e) {
//            throw new RuntimeException(e);
//        }
//    }

    @After("@annotation(myLog)")
    public void after(JoinPoint joinPoint, MyLog myLog) {
        System.out.println("================记录日志=================");
        System.out.println("操作：" + myLog.method());
        System.out.println("描述：" + myLog.desc());
        System.out.println("类型：" + myLog.logType());
    }
}
